#include "htablo.h"
#include "test.h"

HTablo t;

static void TestClear()
{
   t.Clear();
   CHECK_EQ(t.c_str(), "0");
}

static void TestCreate()
{
   t = HTablo("123");
   CHECK_EQ(t.c_str(), "123");

   t = "1234567890.1234567890";
   CHECK_EQ(t.c_str(), "1234567890.12345678");

   t = "1234567890,1234567890";
   CHECK_EQ(t.c_str(), "1234567890.12345678");

   t = "-1234567890.1234567890";
   CHECK_EQ(t.c_str(), "-1234567890.12345678");

   t = "+1234567890.1234567890";
   CHECK_EQ(t.c_str(), "1234567890.12345678");

   t = "1234567890123456789012345678901234567890";
   CHECK_EQ(t.c_str(), "12345678901234567890123456789012");

   t = "-1234567890123456789012345678901234567890";
   CHECK_EQ(t.c_str(), "-12345678901234567890123456789012");

   t = "+1234567890123456789012345678901234567890";
   CHECK_EQ(t.c_str(), "12345678901234567890123456789012");

   t = "1234567890123456789012345678901234567890.1234";
   CHECK_EQ(t.c_str(), "12345678901234567890123456789012");

   t = "-1234567890123456789012345678901234567890.1234";
   CHECK_EQ(t.c_str(), "-12345678901234567890123456789012");

   t = "+1234567890123456789012345678901234567890.1234";
   CHECK_EQ(t.c_str(), "12345678901234567890123456789012");

   t = "12345678901234567890123456789012.12345678";
   CHECK_EQ(t.c_str(), "12345678901234567890123456789012.12345678");

   t = "-12345678901234567890123456789012.12345678";
   CHECK_EQ(t.c_str(), "-12345678901234567890123456789012.12345678");

   t = "+12345678901234567890123456789012.12345678";
   CHECK_EQ(t.c_str(), "12345678901234567890123456789012.12345678");

   t = ".1234";
   CHECK_EQ(t.c_str(), "0.1234");

   t = "-.1234";
   CHECK_EQ(t.c_str(), "-0.1234");

   t = "+.1234";
   CHECK_EQ(t.c_str(), "0.1234");

   t = ".1234";
   CHECK_EQ(t.c_str(), "0.1234");

   t = "0.";
   CHECK_EQ(t.c_str(), "0");

   t = "-0.";
   CHECK_EQ(t.c_str(), "-0");

   t = "+0.";
   CHECK_EQ(t.c_str(), "0");

   t = "123456r890.1234";
   CHECK_EQ(t.c_str(), "123456");

   t = "-1234567890r.1234";
   CHECK_EQ(t.c_str(), "-1234567890");

   t = "+1234567890.r1234";
   CHECK_EQ(t.c_str(), "1234567890");

   t = "+r1234567890.1234";
   CHECK_EQ(t.c_str(), "0");

   t = "0000";
   CHECK_EQ(t.c_str(), "0");

   t = "0000.";
   CHECK_EQ(t.c_str(), "0");

   t = ".0000";
   CHECK_EQ(t.c_str(), "0");

   t = "0000.0000";
   CHECK_EQ(t.c_str(), "0");

   t = "0000,0000";
   CHECK_EQ(t.c_str(), "0");
}

static void TestMinus()
{
   t = "12345678";
   t.PrintMinus();
   CHECK_EQ(t.c_str(), "-12345678");

   t.PrintMinus();
   CHECK_EQ(t.c_str(), "12345678");

   t = "-12345678";
   t.PrintMinus();
   CHECK_EQ(t.c_str(), "12345678");

   t.PrintMinus();
   CHECK_EQ(t.c_str(), "-12345678");
}

static void TestPrintChar()
{
   t.Clear();

   t.PrintChar('0');
   CHECK_EQ(t.c_str(), "0");

   t.PrintChar('-');
   CHECK_EQ(t.c_str(), "0");

   t.PrintChar('-');
   CHECK_EQ(t.c_str(), "0");

   t.PrintChar('1');
   CHECK_EQ(t.c_str(), "1");

   t.PrintChar('2');
   CHECK_EQ(t.c_str(), "12");

   t.PrintChar('3');
   CHECK_EQ(t.c_str(), "123");

   t.PrintChar('4');
   CHECK_EQ(t.c_str(), "1234");

   t.PrintChar('-');
   CHECK_EQ(t.c_str(), "-1234");

   t.PrintChar('-');
   CHECK_EQ(t.c_str(), "1234");

   t.PrintChar('.');
   CHECK_EQ(t.c_str(), "1234.");

   t.PrintChar('.');
   CHECK_EQ(t.c_str(), "1234.");

   t.PrintChar('-');
   CHECK_EQ(t.c_str(), "-1234.");

   t.PrintChar('0');
   CHECK_EQ(t.c_str(), "-1234.0");

   t.PrintChar('0');
   CHECK_EQ(t.c_str(), "-1234.00");

   t.PrintChar('9');
   CHECK_EQ(t.c_str(), "-1234.009");

   t.DelRightChar();
   CHECK_EQ(t.c_str(), "-1234.00");

   t.DelRightChar();
   CHECK_EQ(t.c_str(), "-1234.0");

   t.DelRightChar();
   CHECK_EQ(t.c_str(), "-1234.");

   t.DelRightChar();
   CHECK_EQ(t.c_str(), "-1234");

   t.DelRightChar();
   CHECK_EQ(t.c_str(), "-123");

   t.DelRightChar();
   CHECK_EQ(t.c_str(), "-12");

   t.DelRightChar();
   CHECK_EQ(t.c_str(), "-1");

   t.DelRightChar();
   CHECK_EQ(t.c_str(), "0");

   t.Clear();
   int i;
   for (i=0; i<1000; i++)
      t.PrintChar('0' + i%10);
   CHECK_EQ(t.c_str(), "12345678901234567890123456789012");

   t.Clear();
   for (i=0; i<1000; i++)
   {
      if (i==4) t.PrintChar('-');
      t.PrintChar('0' + i%10);
   }
   CHECK_EQ(t.c_str(), "-12345678901234567890123456789012");

   t.Clear();
   t.PrintChar('.');
   for (i=0; i<1000; i++)
      t.PrintChar('0' + i%10);
   CHECK_EQ(t.c_str(), "0.01234567");

   t.Clear();
   t.PrintChar('.');
   for (i=0; i<1000; i++)
   {
      if (i==4) t.PrintChar('-');
      t.PrintChar('0' + i%100);
   }
   CHECK_EQ(t.c_str(), "-0.01234567");
}

void TestTablo()
{
   TestClear();
   TestCreate();
   TestMinus();
   TestPrintChar();
}
